package util;


import cn.hutool.core.util.ZipUtil;
import cn.hutool.extra.ssh.JschUtil;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.Session;
import pojo.ConfigPoJo;
import pojo.LinuxAccount;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 下载日志文件工具类
 */
public class LinuxUtil {

    public static void downLoadTodayLog() throws Exception {
        // 读取配置文件
        ConfigPoJo config = ConfigUtil.getConfig();

        // 遍历配置文件里的linux集合
        for (LinuxAccount linuxConfig : config.getLinuxList()) {
            // 先创建对应目录
            File dirFile = new File(config.getLogSavePath() + "/" + linuxConfig.getIp().replaceAll("\\.", "-") + "/" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }
            // 创建SSH会话
            Session session = JschUtil.createSession(linuxConfig.getIp(), linuxConfig.getPort(), linuxConfig.getUsername(), linuxConfig.getPassword());
            session.connect();
            // 打开SFTP模式
            ChannelSftp channelSftp = JschUtil.openSftp(session);
            // 获取日志根目录下所有文件
            List<ChannelSftp.LsEntry> fileList = channelSftp.ls(linuxConfig.getLogPath());
            // 下载目录下后缀为.log或.zip的文件，并解压
            for (ChannelSftp.LsEntry file : fileList) {
                if (file.getFilename().endsWith("log") || file.getFilename().endsWith("zip")) {
                    String fileName = linuxConfig.getLogPath() + "/" + file.getFilename();
                    String savePath = dirFile.getPath() + "/" + fileName.substring(fileName.lastIndexOf("/") + 1);
                    // 执行下载指令
                    channelSftp.get(fileName, savePath);
                    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " -- "
                            + linuxConfig.getIp()+"  -- " + fileName.substring(fileName.lastIndexOf("/") + 1) + " -- 下载完毕");
                    // 解压ZIP文件
                    if (file.getFilename().endsWith("zip")) {
                        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " -- "
                                + linuxConfig.getIp()+"  -- " + fileName.substring(fileName.lastIndexOf("/") + 1) + " -- ZIP解压完毕");
                        ZipUtil.unzip(savePath, dirFile.getPath() + "/");
                    }
                    // debug模式下只下载一个文件
                    if (config.isDebug()) {
                        break;
                    }
                }
            }
            // 关闭ssh会话
            JschUtil.close(session);
            // debug模式下只下载一个文件
            if (config.isDebug()) {
                break;
            }
        }
    }

    public static void main(String[] args) throws Exception {
        downLoadTodayLog();
    }
}
